/*
Cookie的读写其实主要就是字符串的操作
*/
var Cookie = new Class({

 //setOptions接口实现
 Implements: Options,

 options: {
  //限制Cookie读取时的路径
  path: false,
  //限制Cookie读取时的域
  domain: false,
  //指定Cookie保存的时间,单位默认为天,不指定时跟浏览器进程绑定
  duration: false,
  //是否要求安全性
  secure: false,
  //指定Cookie对象所属的document对象
  document: document
 },

 //构造函数,key为保存在Cookie中的识别键,出现相同时将覆盖旧数据
 initialize: function(key, options){
  this.key = key;
  this.setOptions(options);
 },

 //写Cookie
 write: function(value){
  //URI编码,避免乱码
  value = encodeURIComponent(value);
  //如果指定Cookie的共享域
  if (this.options.domain) value += '; domain=' + this.options.domain;
  //如果指定Cookie的共享路径
  if (this.options.path) value += '; path=' + this.options.path;
  //如果指定Cookie的保存时间
  if (this.options.duration){
   var date = new Date();
   //转为天单位
   date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
   value += '; expires=' + date.toGMTString();
  }
  //要求安全性
  if (this.options.secure) value += '; secure';
  //写入Cookie
  this.options.document.cookie = this.key + '=' + value;
  return this;
 },

 //读Cookie
 read: function(){
  //当前域的Cookie都在一个以分号";"分隔的等式组组成的字符串中,因此需要作字符串处理
  var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
  //对应写Cookie时的encodeURIComponent
  return (value) ? decodeURIComponent(value[1]) : null;
 },

 //删除Cookie
 dispose: function(){
  //通过写入空的字符串,并且设置过期时间为负值删除指定键的Cookie
  new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
  return this;
 }

});

//静态方法,写Cookie
Cookie.write = function(key, value, options){
 return new Cookie(key, options).write(value);
};

//静态方法,读Cookie
Cookie.read = function(key){
 return new Cookie(key).read();
};

//静态方法,删除Cookie
Cookie.dispose = function(key, options){
 return new Cookie(key, options).dispose();
};